package com.wmb.utils;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.UUID;

public class MyUtils {

    /**
     * 公用的文件上传方法
     *
     * @param multipartFile       request中的文件流对象（接收的前台页面上传的文件对象）
     * @param strUploadfiles      服务器保存上传文件的目录名
     * @param strFileNamePrefix   服务器上传文件新命名的前缀【新前缀+UUID+文件类型后缀】
     * @param objBean             实体类参数【保存上传文件的相对路径】
     * @param beanFilePropetyName 实体类的属性名【保存上传文件相对路径的属性名】
     */
    public static void doSingleFileUpload(MultipartFile multipartFile, String strUploadfiles, String strFileNamePrefix, Object objBean, String beanFilePropetyName) {


        ///////////////////文件上传处理////////////////////

       /*
            步骤：1. 获取服务器上的项目的根目录地址
                 2. 把要上传的文件的目录放在静态资源解析的文件夹中，以便以后使用,需要进行文件拼接
                 3. 判断传递过来的要上传文件的存放目录是否存在，如果不存在，则创建这个目录，然后在上传文件（先有目录再有文件）
                 4. 获取原文件的文件后缀
                 5. 为原文件生成一个新的文件名
                 6. 将重新命名的文件转化为文件流
                 7. 将文件流进行上传

            注意：对文件进行上传后，被上传的文件进入到target中，若进行了clean，则target文件就会消失（再启动才会有），上传的文件也会消失
        */
        System.out.println("上传的文件对象：");
        System.out.println(multipartFile.getOriginalFilename());

        /*
            通过System工具类获取当前服务器发布的地址,获取的是项目在服务器发布的根目录地址
                使用 System.getProperty("server.basePath"),获取服务器的绝对路径地址，
                需要在web.xml中配置 org.springframework.web.util.WebAppRootListener 监听器
         */
        // 获取服务器上的项目的根目录地址
        String strBasePath = System.getProperty("server.basePath");
        System.out.println("服务器根据路地址：" + strBasePath);

        // 把上传的文件的目录放在静态资源解析的文件夹中
        String strfullDirectoryPath = strBasePath + File.separator + "static" + File.separator
                + strUploadfiles + File.separator;

        //判断这个上传文件的存放目录是否存在，如果不存在，则创建这个目录，然后在上传文件（先有目录再有文件）
        File uploadDirectory = new File(strfullDirectoryPath);
        if (!uploadDirectory.exists()) {
            // 创建目录
            uploadDirectory.mkdirs();
        }

        // 给上传文件进行重新命名：先获取原文件名，并通过原文件名 sssxxx.jpg 获取到文件的后缀
        // 用于获取原文件名
        String strOriginalFilename = multipartFile.getOriginalFilename();
        // 用于获取上传源文件的后缀
        String strFileSufix = StringUtils.substringAfterLast(strOriginalFilename, ".");
        System.out.println(strFileSufix);
        // 使用UUID生成新的文件名（防止重复）,strFileNamePrefix这个文件名是调用方法时传进来的
        String strFileNewName = "strFileNamePrefix" + UUID.randomUUID().toString() + "." + strFileSufix;
        // 创建要上传的新文件对象：文件目录+File.separator+文件名
        String uploadNewFileName = strfullDirectoryPath + File.separator + strFileNewName;
        //将要上传的新文件对象new File转为文件数据流
        File uploadNewFile = new File(uploadNewFileName);


        try {
            // 将创建的文件进行上传
            multipartFile.transferTo(uploadNewFile);
            // 这里使用了反射，但是是借助于apache的commons的BeanUtils工具进行实体类的反射处理
            // 文件上传成功以后，将新上传的文件的服务器的相对路径保存到参数实体类的指定的属性字段上
            BeanUtils.setProperty(objBean, beanFilePropetyName, "static" + File.separator
                    + strUploadfiles + File.separator + strFileNewName);

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("文件上传失败：" + e.getMessage());
        }


    }

}



